// 要想使用 es6 语法 需要在 tsconfig.json 配置文件中添加配置 "lib": [ "ES2015" ]
const s1 = Symbol()
console.log(s1)

const s2 = Symbol()
console.log(s2)

// This condition will always return 'false' since the types 'typeof s1' and 'typeof s2' have no overlap
// console.log(s1 === s2)

const s3 = Symbol("lison")
console.log(s3)

const s4 = Symbol("lison")
console.log(s4)

// false
// console.log(s3 === s4)

// Symbol("lison")
console.log(s4.toString())
// true
console.log(Boolean(s4))

let prop = "name"
const sprop = Symbol("name")
const info = {
    // name: 'lison'
    [prop]: 'lison',
    age: 18,
    [sprop]: 'lison' // symbol 可以作为对象的属性名
}

console.log(info)

// 访问 symbol 类型的属性
console.log(info[sprop])

// 遍历 info
// 无法遍历出 symbol 类型的属性名
for (const key in info) {
    console.log(key)
}

// 也无法获取 symbol 类型的key
console.log(Object.keys(info))

// 也无法获取 symbol 类型的key
console.log(Object.getOwnPropertyNames(info))

// 也无法把对象的symbol类型的属性名转成string
console.log(JSON.stringify(info))

// 获取对象中的 symbol 类型的属性名
console.log(Object.getOwnPropertySymbols(info))

// 使用 ES6 中提供的 Reflect 对象获取对象中多有的属性名，包括 symbol 类型的
console.log(Reflect.ownKeys(info))

// Symbol.for() Symbol.keyFor()
const s6 = Symbol.for("lisi")
const s7 = Symbol.for("lisi")
// console.log(s6 === s7)

// Symbol.keyFor(Symbol.for("lisi")) 获取 使用 Symbol.for() 创建的 Symbol 对象的标识
console.log(Symbol.keyFor(s7))

// instance
const obj10 = {
    [Symbol.hasInstance] (aObj: any) {
        console.log(aObj)
    }
}

console.log({a: 1} instanceof (obj10 as any))

// Symbol.isConcatSpreadable
// let arr10 = [1, 2]
// console.log(arr[Symbol.isConcatSpreadable]) 默认值 undefined
// console.log([].concat(arr, 3, 4))
// arr[Symbol.isConcatSpreadable] = false
// console.log([].concat(arr, 3, 4))
